package java学习.第13章_泛型;

import org.junit.Test;

import java.util.*;

/**
 * 泛型 jdk1.5  新增
 * 泛型只能是引用数据类型
 *
 * 如果定义了泛型，最好最好用到泛型
 *
 * 子类在继承带泛型的父类时，指明了泛型类型。则实例化子类对象时，不再需要指明泛型。
 * 1.泛型类可能有多个参数，此时应将多个参数一 起放在尖括号内。比如: <E1, E2,E3>
 * 2.泛型类的"构造器"如下: public GenericClass(){}。
 *   而下面是错误的: public GenericClass<E>(){}
 * 3.实例化后，操作原来泛型位置的结构必须与指定的泛型类型一致。
 * 4.泛型不同的引用不能相互赋值。
 *  >尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型，
 *          但是，在运行时只有一个ArrayList被加载到JVM中。
 * 5.泛型如果不指定，将被擦除，泛型对应的类型均按照Object处理，"但不等价"于Object。
 *          经验:泛型要使用一路都用。要不用，一路都不要用。
 * 6.如果泛型结构是一个接口或抽象类，则不可创建泛型类的对象。
 * 7. jdk1.7，泛型的简化操作: ArrayList<Fruit> f = new ArrayList<>();
 *
 * 8.泛型的指定中不能使用基本数据类型，可以使用包装类替换。
 * 9.在类/接口.上声明的泛型，在本类或本接口中即代表某种类型，可以作为非静态属性的类型、
 *   非静态方法的参数类型、非静态方法的返回值类型。但在 "静态方法中不能使用类的泛型"。
 *   因为静态是在类加载前加载的，但类的泛型实在类加载时给的。
 * 10.   异常类不能是泛型的
 * 11.不能使用new E[]但是可以: E[] elements = (E[])new Object[capacity];
 *
 *      参考: ArrayList源码中声明: Object  elementData，而非泛型参数类型数组。
 *      结论:子类必须是“富二代”，子类除了指定或保留父类的泛型，还可以增加自
 *      己的泛型
 *
 *  Java泛型中的标记符含义：
 *  E - Element (在集合中使用，因为集合中存放的是元素)
 *
 *  T - Type（Java 类）
 *
 *  K - Key（键）
 *  V - Value（值）
 *
 *  N - Number（数值类型）
 *
 * ？ -  表示不确定的java类型
 *  S、U、V  - 2nd、3rd、4th types
 */
public class A_泛型介绍 {

    @Test
    public void 小小的测试() {
        ArrayList<Integer> list = new ArrayList<>();//jdk7新特性:类型推断
        list.add(55);
        list.add(69);
        list.add(46);
        list.add(88);
        list.add(93);
        list.add(60);
//        编译时就会进行类型检查
//        list.add("Tom");//报错

        for (Integer i : list) {
            System.out.println(i);
        }
    }

}
